#include "conversion.h"
#include "math.h"

const unsigned char vector_converter[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

/* Recibe un valor de 8 bits en binario y los convierte en 2 bytes (16 bits) a hexa */
void to_hexa(unsigned char* vector,uint8_t value)
{
	uint8_t aux = value << 4; // Ej: value = 11110001 -> 00010000
	uint8_t less_sing = aux >> 4;//Ej: idem value anterior 00000001=1
	uint8_t most_sing = value >> 4; // Ej: idem value anterior 00001111=15
	vector[0] = vector_converter[most_sing];//Ej: vector_converter[15]
	vector[1] = vector_converter[less_sing];//Ej:vector_converter[1]
	vector[2] = '\0';
}

/* Toma la entrada y mientras lo va procesando y convirtiendo a hexa lo va
 * escribiendo en la salida
 */
void binary_to_hexa(FILE* archivoEntrada, FILE* archivoSalida) {
	while(!feof(archivoEntrada)) {
		uint8_t c = fgetc(archivoEntrada);
		if (!feof(archivoEntrada)) {
            unsigned char hexa[3];
            to_hexa(&hexa[0],c);
			fprintf(archivoSalida, "%s", hexa);
		}
	}
}

/*Recibe un vector de dos caracteres hexa y los convierte a un caracter en binario*/
uint8_t converter_hexa_to_binary(unsigned char* vector)
{
	uint8_t less_bits = vector[1] - '0'; //Ej: 00001001
	uint8_t most_bits = vector[0] - '0'; //Ej: 00000001.
	if (less_bits >= 49)
		less_bits = less_bits - 39;
	else if (less_bits >= 17)
		less_bits = less_bits - 7;

	if (most_bits >= 49)
		most_bits = most_bits - 39;
	else if (most_bits >= 17)
		most_bits = most_bits - 7;

	most_bits = most_bits << 4; //Corro 4 bits a la izq: 00010000
	uint8_t total = most_bits | less_bits; //OR logico : 00011001 = 25
	return total;
}

/*Toma el archivo de entrada y mientras lo va procesando y convirtiendo a binario
 * lo va escribiendo en la salida
 */
void hexa_to_binary(FILE* archivo_entrada, FILE* archivo_salida)
{
	unsigned char par_hexa[3]; //vector donde se almacenan el par hexa de dos bytes
	par_hexa[2]='\0';
	int indice_par_hexa = 0;
	while(indice_par_hexa < 1)
	while(!feof(archivo_entrada))
	{
		unsigned char c = fgetc(archivo_entrada);
	    par_hexa[indice_par_hexa] = c;
	    if (indice_par_hexa == 1)
	    {
	    	--indice_par_hexa;
	    	uint8_t valor_binario = converter_hexa_to_binary(par_hexa); //convierto par hexa a binario
	    	fputc(valor_binario,archivo_salida); //escribo en la salida
	    }
	    else
	    {
	    	++indice_par_hexa;
	    }
	}
}

